package dao

import (
	"gorm.io/gorm"
	"gotham-plan-manage/internal/infra/database/mysql/plan/po"
	"gotham-plan-manage/pkg/consts"
)

/*
   @author:zhongyang
   @date:2023/4/4
   @description:待办项表数据库操作
*/

type TaskItemDao struct {
}

func (d *TaskItemDao) DeleteByPlanId(db *gorm.DB, taskItemPO *po.TaskItemPO) error {
	return db.Where("plan_id = ?", taskItemPO.PlanId).Delete(&taskItemPO).Error
}

func (d *TaskItemDao) FindByTaskId(db *gorm.DB, taskId string) ([]*po.TaskItemPO, error) {
	var res []*po.TaskItemPO
	err := db.Where("todo_task_id = ?", taskId).Find(&res).Error
	if err != nil {
		return nil, err
	}
	return res, nil
}

func (d *TaskItemDao) GetTotalByPlanId(db *gorm.DB, planId string, finished bool) (int64, error) {
	var total int64
	// 优先级高的排前面 + 筛选未完成的
	tx := db.Model(&po.TaskItemPO{}).Where("plan_id = ?", planId)
	// 需要过滤已完成的
	if finished {
		tx = tx.Where("finish_date = ?", consts.DefaultDate)
	}
	err := tx.Count(&total).Error
	if err != nil {
		return 0, err
	}
	return total, nil
}

func (d *TaskItemDao) Create(db *gorm.DB, itemPO *po.TaskItemPO) error {
	return db.Create(&itemPO).Error
}

func (d *TaskItemDao) Delete(db *gorm.DB, taskItemId string) error {
	return db.Where("task_item_id = ?", taskItemId).Delete(&po.TaskItemPO{}).Error
}

func (d *TaskItemDao) DeleteByTaskId(db *gorm.DB, taskId string) error {
	return db.Where("todo_task_id = ?", taskId).Delete(&po.TaskItemPO{}).Error
}

func (d *TaskItemDao) GetOne(db *gorm.DB, taskItemId string) (*po.TaskItemPO, error) {
	var res *po.TaskItemPO
	err := db.Where("task_item_id = ?", taskItemId).First(&res).Error
	if err != nil {
		return nil, err
	}
	return res, nil
}

func (d *TaskItemDao) Finish(db *gorm.DB, itemPO *po.TaskItemPO) error {
	return db.Model(&po.TaskItemPO{}).Where("task_item_id = ?", itemPO.TaskItemId).Update("finish_date", itemPO.FinishDate).Error
}

func (d *TaskItemDao) GetOngoingTaskItems(db *gorm.DB, scope string) ([]*po.TaskItemPO, error) {
	return nil, nil
}

func (d *TaskItemDao) Edit(db *gorm.DB, itemPO *po.TaskItemPO) error {
	// 只更新改动的
	return db.Updates(itemPO).Error
}

func (d *TaskItemDao) FindOngoing(db *gorm.DB, TodoTaskId string) ([]*po.TaskItemPO, error) {
	var items []*po.TaskItemPO
	err := db.Where("todo_task_id = ? and finish_date = ?", TodoTaskId, consts.DefaultDate).Find(&items).Error
	return items, err
}

func (d *TaskItemDao) GetTaskItemListByTaskId(db *gorm.DB, taskId string, planId string) (res []*po.TaskItemPO, err error) {
	// 优先级高的排前面
	err = db.Where("todo_task_id = ? and plan_id = ?", taskId, planId).Order("level desc").Find(&res).Error
	if err != nil {
		return nil, err
	}
	return res, nil
}

func (d *TaskItemDao) FindAllByPlanId(db *gorm.DB, planID string) ([]*po.TaskItemPO, error) {
	var res []*po.TaskItemPO
	err := db.Where("plan_id = ?", planID).Find(&res).Error
	if err != nil {
		return nil, err
	}
	return res, nil
}

func (d *TaskItemDao) GetTotalByTaskId(db *gorm.DB, taskId string) (int64, error) {
	var total int64
	err := db.Model(&po.TaskItemPO{}).Where("todo_task_id = ?", taskId).Count(&total).Error
	if err != nil {
		return 0, err
	}
	return total, nil
}

func NewTaskItemDao() *TaskItemDao {
	return &TaskItemDao{}
}
